﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Riel_Gestion.dao;
using Riel_Gestion.entities;
using log4net;
using Riel_Gestion.printer;

namespace Riel_Gestion
{
    public partial class FrmFichaCliente : Form
    {
        private static readonly ILog logger = LogManager.GetLogger(typeof(FrmFichaCliente));
        private static String ID_FECHA_PRED = "fechaPred";

        String idCliente = null;
        Decimal debe = 0;
        Decimal haber = 0;
        Decimal saldoAnt = 0;
        Decimal saldoAcum = 0;

        FrmFiltroCliente frmFiltroCliente;

        int filasAct = 0;

        public String IdCliente
        {
            get { return idCliente; }
            set { idCliente = value; }
        }

        public FrmFichaCliente()
        {
            InitializeComponent();

            DateTimePicker dtp = new DateTimePicker();


        }

        private void vENTABindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            int res = 0;
            this.Validate();
            this.vENTABindingSource.EndEdit();            
            DataRowCollection rowc = this.rielDataSet.Tables["VENTA"].Rows;

            foreach (DataRow dr in rowc)
            {
                if (!IdCliente.Equals(dr["CODCLIENTE"].ToString()))
                {
                    logger.Info("Agregando Venta al cliente: " + IdCliente);

                    int codCliente = int.Parse(IdCliente);
                    DateTime dateTime = (DateTime)dr["FECHAHORA"];
                    String desc = (String)dr["DESCRIPCION"];
                    Decimal debe = (Decimal) dr["IMPORTEVENTA"];
                    Decimal haber = (Decimal)dr["IMPORTEPAGO"];
                    Decimal saldo = (Decimal)dr["SALDO"];

                    res = vENTATableAdapter.Insert(codCliente, dateTime, desc, debe, haber, saldo);                    

                    if (res == 0)
                    {
                        logger.Error("No se pudo agregar Venta");
                        MessageBox.Show("No se pudo agregar la venta al proveedor", "Nueva Venta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }

                }
            }

            if (res > 0)
            {
                logger.Info("Venta agregada correctamente");
                FrmMain.showInfoDialog("Venta agregada correctamente", "Nueva Venta");
            }

            refreshSaldos();
            filasAct = vENTADataGridView.RowCount;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            logger.Info("Cargando datos del formulario FrmFichaCliente");
            ToolTip toolTipEditar = new ToolTip();
            ToolTip toolTipEliminar = new ToolTip();
            toolTipEditar.SetToolTip(this.btnEditarCliente, "Editar los datos del cliente");
            toolTipEliminar.SetToolTip(this.btnEliminar, "Eliminar cliente");

            DTOCliente cliente = ClienteDAO.getData(idCliente);

            ///Carga de datos personales del cliente
            lblCliente.Text = cliente.CodCliente.ToString();
            lblCuit.Text = cliente.Cuit;
            lblDireccion.Text = cliente.Direccion;
            lblIva.Text = cliente.Iva;
            lblNombre.Text = cliente.Nombre;
            this.Text += lblCliente.Text;

            //Cargo el datagrid con fecha predeterminada indicada
            dtpFDesde.Value = getFecha();
            this.vENTATableAdapter.FillByIDAndDates(rielDataSet.VENTA, int.Parse(IdCliente), dtpFDesde.Value.Date);            

            //Cargo saldos
            refreshSaldos();

            filasAct = vENTADataGridView.RowCount;

        }

        private DateTime getFecha()
        {
            int fechaPred = int.Parse(LocalProperties.getInstance().getProperty(ID_FECHA_PRED));
            DateTime dt = DateTime.Now.Date;
            switch (fechaPred)
            {
                case 1://Semanal
                    dt = DateTime.Now.Date.AddDays(-7);
                    break;
                case 2://Mensual
                    dt = DateTime.Now.Date.AddMonths(-1);
                    break;
                case 3://Bimestral
                    dt = DateTime.Now.Date.AddMonths(-2);
                    break;
                case 4://Trimestral
                    dt = DateTime.Now.Date.AddMonths(-3);
                    break;
                case 5://Semestral
                    dt = DateTime.Now.Date.AddMonths(-6);
                    break;
                case 6://Anual
                    dt = DateTime.Now.Date.AddYears(-1);
                    break;
            }
            return dt;
        }


        private void refreshSaldos()
        {
            logger.Debug("Recargando Saldos...");
            DTOSaldo saldos = new DTOSaldo(lblCliente.Text);
            saldos = VentaDAO.getSaldosTotalesById(lblCliente.Text);

            lblTotDebe.Text = String.Format("{0:0.00}", saldos.TotDebe);
            lblTotHaber.Text = String.Format("{0:0.00}", saldos.TotHaber);
            lblTotSaldo.Text = String.Format("{0:0.00}", saldos.TotSaldo);

            lblTotSaldo.Font = new Font(lblTotSaldo.Font, FontStyle.Bold);

            lblTotSaldo.ForeColor = getForeColor(saldos.TotSaldo);
        }

        private Color getForeColor(Decimal value)
        {
            if (value > 0)
                return Color.Red;
            else if (value < 0)
                return Color.Green;
            else
                return Color.Blue;
        }

        private void btnEditarCliente_Click(object sender, EventArgs e)
        {
            logger.Info("Accediendo a FrmModificarCliente...");
            FrmModificarCliente frmModificarCliente = new FrmModificarCliente(IdCliente);
            frmModificarCliente.ShowDialog();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            DialogResult dialogResult = MessageBox.Show("¿Esta seguro que desea eliminar al cliente?", "Eliminar Cliente", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
            if (dialogResult == DialogResult.Yes)
            {
                logger.Info("Eliminando Cliente: " + IdCliente);
                
                //Primero hay que eliminar las ventas hechas para el cliente
                int res = vENTATableAdapter.DeleteQueryByIDCliente(int.Parse(idCliente));

                if (res > 0)
                {
                    logger.Info("Se eliminaron " + res + " ventas del cliente " + idCliente);
                    FrmMain.showInfoDialog("Se eliminaron " + res + "ventas del cliente " + idCliente, "Ventas...");
                    
                    rielDataSetTableAdapters.CLIENTETableAdapter cliente = new Riel_Gestion.rielDataSetTableAdapters.CLIENTETableAdapter();
                    
                    res = cliente.DeleteQueryByID(int.Parse(idCliente));
                    
                    if(res > 0)
                    {
                        logger.Info("Se eliminaron los datos personales del cliente");
                        FrmMain.showInfoDialog("Se eliminaron los datos personales del cliente","Datos eliminados");
                    }
                    if (res < 0)
                    {
                        logger.Error("Error al eliminar datos personales del cliente");
                        FrmMain.showErrorDialog("Error al eliminar datos personales del cliente");
                    }

                }

                if (res == 0)
                {
                    logger.Info("No hay ventas a eliminar para el cliente " + idCliente);
                    FrmMain.showInfoDialog("No hay ventas a eliminar para el cliente " + idCliente, "No se eliminaron ventas"); 
                }

                if (res < 0)
                {
                    logger.Error("Error al eliminar ventas para el cliente " + idCliente);
                    FrmMain.showErrorDialog("Error al eliminar ventas para el cliente " + idCliente); 
                }                
            }

            this.Close();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (filasAct != vENTADataGridView.RowCount)
                if (FrmMain.showInfoYesNoDialog("¿Desea guardar los cambios?", "Ficha Cliente") == DialogResult.Yes)
                    vENTABindingNavigatorSaveItem_Click(sender, e);

            this.Close();
        }

        private void vENTADataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                if (e.RowIndex == (vENTADataGridView.RowCount - 1))
                {
                    if (e.RowIndex == 0)
                    {
                        saldoAnt = 0;
                        vENTADataGridView.Rows[e.RowIndex].Cells[4].Value = saldoAnt;
                    }
                    else
                    {
                        vENTADataGridView.Rows[e.RowIndex].Cells[4].Value = vENTADataGridView.Rows[e.RowIndex - 1].Cells[4].Value;
                        saldoAnt = Decimal.Parse(vENTADataGridView.Rows[e.RowIndex].Cells[4].Value.ToString());
                    }
                }
            }

            if (e.ColumnIndex == 2)
            {
                //Verifico que las celdas no queden vacias
                if ("".Equals(vENTADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()))
                    vENTADataGridView.Rows[e.RowIndex].Cells[2].Value = 0;

                if ("".Equals(vENTADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString()))
                    vENTADataGridView.Rows[e.RowIndex].Cells[3].Value = 0;

                vENTADataGridView.Rows[e.RowIndex].Cells[4].Value = saldoAnt + Decimal.Parse(vENTADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()) - Decimal.Parse(vENTADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString());
            }

            if (e.ColumnIndex == 3)
            {
                //Verifico que las celdas no queden vacias
                if ("".Equals(vENTADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()))
                    vENTADataGridView.Rows[e.RowIndex].Cells[2].Value = 0;

                if ("".Equals(vENTADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString()))
                    vENTADataGridView.Rows[e.RowIndex].Cells[3].Value = 0;

                vENTADataGridView.Rows[e.RowIndex].Cells[4].Value = saldoAnt + Decimal.Parse(vENTADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString()) - Decimal.Parse(vENTADataGridView.Rows[e.RowIndex].Cells[3].Value.ToString());
            }          
        }

        private void showDialogError(int col)
        {
            MessageBox.Show("El valor ingresado para la columna " + vENTADataGridView.Columns[col].HeaderText + " no es válido.", "Error en campo", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void vENTADataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (e.Exception.GetType().ToString().Equals("System.FormatException"))
            {
                //Valido Fecha
                if(e.ColumnIndex == 0)
                    MessageBox.Show("La fecha ingresada es incorrecta!\nIngrese una fecha con formato dia/mes/año.", "Error en fecha", MessageBoxButtons.OK, MessageBoxIcon.Error);

                if (e.ColumnIndex > 1)
                {
                    Decimal result;
                    if (!Decimal.TryParse(vENTADataGridView.Rows[e.RowIndex].Cells[2].Value.ToString(), out result))
                    {
                        showDialogError(e.ColumnIndex);
                    }
                }
            }
        }

        private void vENTADataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 && e.RowIndex == vENTADataGridView.Rows.Count - 1)
                vENTADataGridView.Rows[e.RowIndex].Cells[0].Value = DateTime.Now.Date;
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            PrinterImpl printer = new PrinterImpl(vENTADataGridView, "Ficha Cliente: " + idCliente);

            printPreviewDialog.Document = printer.getDocument();
            if (printPreviewDialog.ShowDialog() == DialogResult.OK)
            {
                logger.Info("Imprimiendo documento...");
                printer.print();
            }
        }

        private void limpiarSaldos()
        {
            logger.Info("limpiando saldos");
            saldoAcum = saldoAnt = debe = haber = 0;
        }

        private void dtpFDesde_ValueChanged(object sender, EventArgs e)
        {
            logger.Info("Recargando la tabla de ventas con la fecha: " + dtpFDesde.Value.Date.ToString());
            this.vENTATableAdapter.FillByIDAndDates(rielDataSet.VENTA, int.Parse(IdCliente), dtpFDesde.Value.Date);            
        }
    }
}